package com.yydm.serviceedu.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yydm.commonutils.R;
import com.yydm.servicebase.exceptionhandler.LException;
import com.yydm.serviceedu.entity.Automobile;
import com.yydm.serviceedu.service.AutomobileService;
import com.yydm.serviceedu.vo.AutomobileQueryVo;
import com.yydm.serviceedu.vo.AutomobileVo;
import com.yydm.serviceedu.vo.DataVo;
import com.yydm.serviceedu.vo.PieVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 汽车产品 前端控制器
 * </p>
 *
 * @author yydm
 * @since 2022-06-13
 */
@RestController
@RequestMapping("/serviceauto/product")
@Slf4j
//@CrossOrigin
public class ProductController {


    @Autowired
    private AutomobileService automobileService;

    //    查询所有
    @GetMapping("/getAll")
    public R getAll() {
        List<Automobile> list = automobileService.list(null);
        list.forEach(System.out::println);
        return R.ok().data("items", list);
    }

    //    删除
    @DeleteMapping("/delete/{id}")
    public R deleteId(@PathVariable("id") int id) {
        boolean b = automobileService.removeById(id);
        if (b) {
            return R.ok();
        } else {
            return R.error();
        }
    }

    //分页查询
    @GetMapping("/page/{current}/{size}")
    public R page(
            @PathVariable("current") long current,
            @PathVariable("size") long size
    ) {
//      创建page对象  current当前页  size当前页个数
        Page<Automobile> page = new Page<>(current, size);

        try {
//            int i = 10 / 0;
        } catch (Exception e) {
//            执行自定义异常
            throw new LException(500, "执行了自定义异常处理...");
        }

//        调用方法实现分页
//        调用方法的时候，底层封装，把分页所有的数据封装到page对象中
        automobileService.page(page, null);

//      总记录数
        long total = page.getTotal();

        log.info("{}" + total + "个", "当前的数据的个数:");
//      数据list集合
        List<Automobile> records = page.getRecords();

//        Map map = new HashMap<>();
//        map.put("total", total);
//        map.put("records", records);
//        return R.ok().data(map);

        return R.ok().data("total", total).data("records", records);
    }

    //    条件查询带分页的方法
    @PostMapping("/pageQueryWrapper/{current}/{size}")
    public R pageQueryWrapper(
            @PathVariable("current") long current,
            @PathVariable("size") long size,
            @RequestBody(required = false) AutomobileQueryVo automobileQueryVo
    ) {
//        current当前页  size当前页个数
        Page<Automobile> page = new Page<>(current, size);

//        构建条件
        QueryWrapper<Automobile> wrapper = new QueryWrapper<>();
//        多条件组合查询
//        mybatis 动态sql
//        汽车名称
        String name = automobileQueryVo.getName();
//        汽车级别
        String category = automobileQueryVo.getCategory();
//        创建时间
        String createTime = automobileQueryVo.getCreateTime();
//        修改时间
        String updateTime = automobileQueryVo.getUpdateTime();
//        判断条件值是否为空,如果不为空拼接条件
        if (!StringUtils.isEmpty(name)) {
            wrapper.like("product_name", name);
        }
//        判断条件是否等于
        if (!StringUtils.isEmpty(category)) {
            wrapper.eq("product_category", category);
        }

        if (!StringUtils.isEmpty(createTime)) {
//            大于等于
            wrapper.ge("create_time", createTime);
        }

        if (!StringUtils.isEmpty(updateTime)) {
//            小于等于
            wrapper.le("update_time", updateTime);
        }
//        排序 降序
        wrapper.orderByDesc("create_time");

//        调用方法实现条件查询分页
        automobileService.page(page, wrapper);

//        总记录数
        long total = page.getTotal();
//        数据list集合
        List<Automobile> records = page.getRecords();

        return R.ok().data("total", total).data("records", records);
    }

    //    添加汽车方法
    @PostMapping("/addAutomobile")
    public R addAutomobile(@RequestBody Automobile automobile) {
        System.out.println(automobile);
        boolean save = automobileService.save(automobile);
        if (save) {
            return R.ok();
        } else {
            return R.error();
        }
    }

    //    根据id查询
    @GetMapping("/getAutomobile/{id}")
    public R getAutomobile(@PathVariable("id") int id) {
        Automobile byId = automobileService.getById(id);
        return R.ok().data("getAutomobile", byId);
    }

    //    修改汽车数据
    @PostMapping("/updateAutomobile")
    public R updateAutomobile(@RequestBody Automobile automobile) {
        boolean b = automobileService.updateById(automobile);
        if (b) {
            return R.ok();
        } else {
            return R.error();
        }
    }


    //    后台柱状图
    @GetMapping("/selectAutomobileVo")
    @ResponseBody
    public AutomobileVo automobileVo() {
        AutomobileVo automobileVo = new AutomobileVo();
        List<String> name = new ArrayList<>();
        List<DataVo> quantity = new ArrayList<>();
        QueryWrapper<Automobile> wrapper = new QueryWrapper<>();
        wrapper.between("id", 30, 35);
        List<Automobile> list = automobileService.list(wrapper);

        for (Automobile automobile : list) {
            name.add(automobile.getProductName());
            DataVo dataVo = new DataVo();
            dataVo.setValue(automobile.getProductQuantity());
            quantity.add(dataVo);
        }
        automobileVo.setName(name);
        automobileVo.setQuantity(quantity);

        return automobileVo;
    }


    //    后台饼状图
    @GetMapping("/pieVOList")
    @ResponseBody
    public List<PieVo> pieVoList() {
        List<PieVo> pieVoList = new ArrayList<>();
        QueryWrapper<Automobile> wrapper = new QueryWrapper<>();
        wrapper.between("id", 30, 35);
        List<Automobile> list = automobileService.list(wrapper);
        for (Automobile automobile : list) {
            PieVo pieVo = new PieVo();
            pieVo.setValue(automobile.getProductQuantity());
            pieVo.setName(automobile.getProductName());
            pieVoList.add(pieVo);
        }
        return pieVoList;
    }

}
